#include "user_msg.h"

MSG_FIFO_T g_tMsg;

/* 初始化消息FIFO */
void bsp_InitMsg(void)
{
	bsp_ClearMsg();
}

/**
 * @brief		压入一条消息到FIFO缓冲
 * @param		msgCode: 消息代码
 * @param		msgParam: 消息参数
 * @retval	None	
 * @note		485接收数据用
 */
void bsp_PutMsg(uint16_t msgCode, uint32_t msgParam)
{
	g_tMsg.Buf[g_tMsg.Write].MsgCode = msgCode;
	g_tMsg.Buf[g_tMsg.Write].MsgParam = msgParam;
	// 写指针自动加一，并判断是否FIFO缓冲区满
	if(++g_tMsg.Write >= MSG_FIFO_SIZE)
	{
		g_tMsg.Write = 0;
	}
}

/**
 * @brief		从FIFO中读一个消息
 * @param		pMsg: 存放消息的结构体指针
 * @retval	0: 无消息	  1: 有消息
 * @note		一般使用局部变量过度一下，例如: *p
 */
uint8_t bsp_GetMsg(MSG_T* pMsg)
{
	MSG_T *p;

	// 无消息
	if(g_tMsg.Read == g_tMsg.Write)
	{
		return 0;
	}
	else
	{
		// 从FIFO中读一条消息
		p = &g_tMsg.Buf[g_tMsg.Read];
		if(++g_tMsg.Read >= MSG_FIFO_SIZE)
		{
			g_tMsg.Read = 0;
		}
		
		pMsg->MsgCode = p->MsgCode;
		pMsg->MsgParam = p->MsgParam;

		return 1;
	}
}

/* 清空消息FIFO缓冲区 */
void bsp_ClearMsg(void)
{
	g_tMsg.Read = g_tMsg.Write;
}

